home *** CD-ROM | disk | FTP | other *** search
/ Micromanía 90 / CDMM_90_1.ISO / Cycling Manager 2 / CyclingManager2Demo.exe / Disk1 / data1.cab / Game / DataCM2 / MenuServer / UserClient.cnc < prev    next >
Encoding:
Text File  |  2002-05-10  |  62.0 KB  |  2,025 lines

  1. func void MSComponentDestroy(Gui_Component _poComponent)
  2. {
  3.     DeleteComponent(_poComponent);
  4. }
  5.  
  6. // ******************************************************
  7. // * Function : Player server connect/disconnect callback
  8. // * Parameters : client : client connected/disconnected
  9. // * 
  10. // * Add/Remove the client to/from the client list
  11. // ****** *************************************************
  12. func void GuestConnectCB(Net_Client _client)
  13. {
  14.     var Gui_Component pthis;
  15.     var CGuestUser pdtData;
  16.     var CBasicGuest pdtBasicGuestData;
  17.     var CLoginGuest pdtLoginGuestData;
  18.     var Gui_Component pComponent;
  19.  
  20.     print("<< guest connection: waiting for login...\n");
  21.     
  22.     // get this pointer
  23.     pthis = GetThis();
  24.  
  25.     // new component
  26.     pComponent = NewObject(iGuestUserInterface);
  27.     MountComponent(pthis, pComponent);
  28.     NetClient_SetComponent(_client, pComponent);
  29.  
  30.     // new common data
  31.     pdtData = new CGuestUser;
  32.     SetData(pComponent,pdtData);
  33.  
  34.     // init data
  35.     pdtData.m_iUserId = 0;
  36.     pdtData.m_pClient = _client;
  37.  
  38.     // guest interface
  39.     pdtBasicGuestData = new CBasicGuest;
  40.     AddInterface( pComponent , iGuestInterface, pdtBasicGuestData);
  41.     
  42.     // login interface
  43.     pdtLoginGuestData = new CLoginGuest;
  44.     AddInterface( pComponent , iGuestLoginInterface, pdtLoginGuestData);
  45. }
  46.  
  47. func void GuestDisconnectCB (Net_Client _client)
  48. {
  49.     print("guest disconnection.\n");
  50.  
  51.     var Gui_Component pthis;
  52.     pthis = GetThis();
  53.     g_pAncestorComponent << ComponentDestroy(pthis);
  54. }
  55.  
  56. func void UserDisconnectCB (Net_Client _client)
  57. {
  58.     var i32x iUserId;
  59.     var i32x iPreRaceTeamId;
  60.  
  61.     var Gui_Component pthis;
  62.     var CGuestUser pdtPrimaryData;
  63.     var CBasicUser pdtData;
  64.     pthis = GetThis();
  65.     pdtData = GetData(pthis);
  66.     pdtPrimaryData = GetPrimaryData(pthis);
  67.  
  68.  
  69.     iUserId = pdtPrimaryData.m_iUserId;
  70.     println("user disconnection : " + itoa(iUserId));
  71.     
  72.     // update database
  73.     Join_SetIntFromIndex(    g_stJoins.m_iGame_iNumConnected, 0, Join_GetIntFromIndex( g_stJoins.m_iGame_iNumConnected, 0 ) - 1);
  74.     Join_SetIntFromKey(g_stJoins.m_iUser_iInRaceReady,    iUserId, 0);
  75.     Join_SetIntFromKey(g_stJoins.m_iUser_iConnected,    iUserId, 0);
  76.     
  77.     // inrace ?
  78.     // Client disconnected while in race
  79.     // Remove game client of Game Server
  80.     if (GetGameServerState()==1)
  81.     {
  82.         RemoveClient(iUserId);
  83.     }
  84.         
  85.     // notify users
  86.     Database_SendSynchronization(DATABASE_SERVER);
  87.  
  88.     g_pAncestorComponent << ComponentDestroy(pthis);
  89. }
  90.  
  91.  
  92.  
  93.  
  94. // *********************
  95. // user login
  96. // *********************
  97. func void fnMSUserLogin (szx _szLogin, szx _szPassword )
  98. {
  99.  
  100.     var i32x ok;
  101.     
  102.     // get client
  103.     var Net_Client client;
  104.     client = GetCurrentClient();
  105.  
  106.     var i32x i;
  107.     var i32x iUserID,iTeamID,guestok;
  108.     var i32x iPreRaceTeamId;
  109.     var szx szAuthorization;
  110.  
  111.     var CSubscribeGuest pdtSubscribeGuestData;
  112.     var CInRaceUser pdtInRaceUserData;
  113.     var CBasicUser pdtUserData;
  114.  
  115.     var Gui_Component pthis;
  116.     var CGuestUser pdtPrimaryData;
  117.     var CLoginGuest pdtData;
  118.     pthis = GetThis();
  119.     pdtData = GetData(pthis);
  120.     pdtPrimaryData = GetPrimaryData(pthis);
  121.  
  122.  
  123.     print( _szLogin + ":" + _szPassword + " trying to login..\n");
  124.  
  125.     
  126.     ok = 1;
  127.     iUserID = -1;
  128.     iTeamID = -1;
  129.  
  130.     // get user
  131.     iUserID = Join_FindKeyFromStringData(g_stJoins.m_iUser_szLogin, _szLogin);
  132.     if (iUserID == -1)
  133.     {
  134.         // Guest connection
  135.         print(_szLogin + " login as guest\n");
  136.         guestok = 1;
  137.  
  138.         if(guestok==1)
  139.         {
  140.             // new login
  141.             pdtPrimaryData.m_szLogin = _szLogin;
  142.             pdtPrimaryData.m_szPassword = _szPassword;
  143.             
  144.  
  145.             // remove login interface
  146.             RemoveInterface(pthis);
  147.                 
  148.             if(!IsGameModeEnded())
  149.             {
  150.                 pdtSubscribeGuestData = new CSubscribeGuest;
  151.                 AddInterface( pthis , iGuestSubscribeInterface, pdtSubscribeGuestData);
  152.             }
  153.  
  154.             // notify clients
  155.             Database_SendSynchronization(DATABASE_SERVER);
  156.  
  157.             // send database
  158.             Database_Send(DATABASE_SERVER,"ServerDB",client);
  159.  
  160.             // Inform client
  161.             client << mUser_GameGuestOK();
  162.         }
  163.     }
  164.     else
  165.     {
  166.         print(_szLogin + " login as user "+itoa(iUserID) +"\n");
  167.  
  168.         // Registered user connection
  169.  
  170.  
  171.         // password
  172.         if (ok==1)
  173.         {
  174.             if (strcmp(Join_GetStringFromKey(g_stJoins.m_iUser_szPassword, iUserID),_szPassword)!=0)
  175.             {
  176.                 println("wrong password : " + Join_GetStringFromKey(g_stJoins.m_iUser_szPassword, iUserID) + +":" + _szPassword);
  177.                 ok = 0;
  178.             }
  179.         }
  180.  
  181.         // get team
  182.         if (ok==1)
  183.         {
  184.             iTeamID = Join_GetIntFromKey(g_stJoins.m_iUser_iTeamId, iUserID);
  185.             if (iTeamID == -1)
  186.             {
  187.                 println("No team for user " + itoa(iUserID));
  188.                 ok = 0;
  189.             }
  190.         }
  191.  
  192.         // verify that a user with the same login is already connected
  193.         if (ok==1)
  194.         {
  195.             if (Join_GetIntFromKey(    g_stJoins.m_iUser_iConnected,    iUserID)==1)
  196.             {
  197.                 print("duplicated login\n");
  198.                 ok = 0;
  199.             }
  200.         }
  201.  
  202.         // add client
  203.         if (ok==1)
  204.         {
  205.             // reuse login
  206.             pdtPrimaryData.m_szLogin = _szLogin;
  207.             pdtPrimaryData.m_szPassword = _szPassword;
  208.             pdtPrimaryData.m_iUserId = iUserID;
  209.                                     
  210.             // update database
  211.             Join_SetIntFromIndex(    g_stJoins.m_iGame_iNumConnected, 0, Join_GetIntFromIndex( g_stJoins.m_iGame_iNumConnected, 0 ) + 1);
  212.             Join_SetStringFromKey(    g_stJoins.m_iUser_szPassword,    iUserID, _szPassword);
  213.             Join_SetIntFromKey(        g_stJoins.m_iUser_iConnected,    iUserID, 1);
  214.             
  215.             // inrace ?
  216.             if(GetGameServerState()==1)
  217.             {
  218.                 Join_SetIntFromKey(g_stJoins.m_iUser_iInRaceReady, iUserID, 0);
  219.                 iPreRaceTeamId = Join_GetIntFromKey(g_stJoins.m_iUser_iPreRaceTeamId, iUserID);
  220.             }
  221.  
  222.             // inform client
  223.             client << mUser_GameLoginOK (iUserID);
  224.  
  225.  
  226.             // notify clients
  227.             Database_SendSynchronization(DATABASE_SERVER);
  228.  
  229.             // send database
  230.             Database_Send(DATABASE_SERVER,"ServerDB",client);
  231.  
  232.  
  233.             
  234.             
  235.             if(!IsGameModeEnded())
  236.             {
  237.                 // remove login interface
  238.                 RemoveInterface(pthis);
  239.  
  240.                 // remove guest interface
  241.                 RemoveInterface(pthis);
  242.                 
  243.                 // user interface instead of guest interface
  244.                 pdtUserData = new CBasicUser;
  245.                 AddInterface(pthis,iUserInterface,pdtUserData);
  246.                 
  247.                 if(GetGameServerState()==1)
  248.                 {
  249.                     // inrace interface
  250.                     pdtInRaceUserData = new CInRaceUser;
  251.                     AddInterface(pthis,iInRace,pdtInRaceUserData);
  252.  
  253.                     // Client connected while in race
  254.                     // Add game client to Game Server
  255.                     if(iPreRaceTeamId != -1)
  256.                     {
  257.                         print("Adding client to resolution server.\n");
  258.                         client << mUser_InRaceStart(iPreRaceTeamId);
  259.                     }
  260.                 }
  261.                 
  262.             }
  263.             /*
  264.             else
  265.             {
  266.                 // Set client to game over
  267.                 NetClient_SetInterface(client,iGameOver);
  268.             }
  269.             */
  270.         }
  271.         else
  272.         {
  273.             NetClient_Disconnect(client);
  274.         }
  275.     }
  276. }
  277.  
  278.  
  279.  
  280.  
  281.  
  282.  
  283.  
  284.  
  285. // *********************
  286. // *** Admin command ***
  287. // *********************
  288.  
  289.  
  290.  
  291.  
  292.  
  293.  
  294. func void fnAdminKickUser(szx _szLogin)
  295. {
  296.     /*var Net_Client pClient;
  297.     var Net_ClientList pClientList;
  298.     
  299.     var i32x iUserID;
  300.     var i32x iKickUserID;
  301.     
  302.     // get client
  303.     pClient = GetCurrentClient();
  304.     iUserID = NetClient_GetId(pClient);
  305.     
  306.     iKickUserID = Join_FindKeyFromStringData(g_stJoins.m_iUser_szLogin, _szLogin);
  307.     if (iKickUserID>0)
  308.     {
  309.         if (iKickUserID!=iUserID)
  310.         {
  311.             // kick user
  312.             println("admin kicks out user" + _szLogin);
  313.             
  314.             // get client
  315.             pClientList = NetServer_GetClientList(g_pServer,G_iRegisteredClientList);
  316.             pClient = NetClientList_FindClient(pClientList,iKickUserID);
  317.             
  318.             // unsubscribe & Disconnect
  319.             fnDBUnsubscribeUser(iKickUserID);
  320.             if (pClient)
  321.                 NetClient_Disconnect(pClient);
  322.         }
  323.         Database_SendSynchronization(DATABASE_SERVER);
  324.     }*/
  325. }
  326.  
  327. // valid next phase
  328. func void fnGameVote_Test()
  329. {
  330.     var i32x iUserID,iNumUsers,iUser,iContinue,iNextRace,bWait;
  331.  
  332.     //Database_HTMLDebugPrint(DATABASE_SERVER);
  333.     bWait = false;
  334.     iContinue = 0;
  335.     iNextRace = 0;
  336.     iUser = 0;
  337.     iNumUsers = Join_GetNumRows(g_stJoins.m_iUser_iLaunchGame);
  338.     print("iNumUsers:"+itoa(iNumUsers)+"\n");
  339.     while(iUser<iNumUsers)
  340.     {
  341.         if(Join_GetIntFromIndex(g_stJoins.m_iUser_iConnected,iUser) == 1)
  342.         {
  343.             if(Join_GetIntFromIndex(g_stJoins.m_iUser_iState,iUser) == 2)
  344.             {
  345.                 iContinue = iContinue + 1;
  346.             }
  347.             else if(Join_GetIntFromIndex(g_stJoins.m_iUser_iState,iUser) == 3)
  348.             {
  349.                 iNextRace = iNextRace + 1;
  350.             }
  351.             else
  352.             {
  353.                 // One is waiting
  354.                 bWait = true;
  355.                 print("User:"+itoa(iUser)+" Waiting\n");
  356.             }
  357.         }
  358.         iUser = iUser + 1;
  359.     }
  360.  
  361.     if(!bWait)
  362.     {
  363.         // Are we in race ?
  364.         if(GetGameServerState()==0)
  365.         {
  366.             // Reset ready flags
  367.             iUser = 0;
  368.             while(iUser<iNumUsers)
  369.             {
  370.                 Join_SetIntFromIndex(g_stJoins.m_iUser_iState,iUser,1);
  371.                 iUser = iUser + 1;
  372.             }
  373.             // *********************************
  374.             // HADES DEBUG DAY TURN TEST IA
  375.             // Jump to next day / event
  376.             //print("Hades Debug Next day...\n");
  377.             //DayTurn();
  378.             // *********************************
  379.             
  380.             if(GetCurrentDay() != Join_GetIntFromKey(g_stJoins.m_iStage_iDay,GetCurrentStageID()) )
  381.             {
  382.                 if(iContinue>=iNextRace)
  383.                 {
  384.                     // Jump to next day / event
  385.                     print("Next day...\n");
  386.                     DayTurn();
  387.                 }
  388.                 else
  389.                 {
  390.                     // Jump to next race
  391.                     print("Next race...\n");
  392.                     SetDayOfStage();
  393.                 }
  394.             }
  395.             else
  396.             {
  397.                 if(iNextRace==0)
  398.                 {
  399.                     // Prepare race
  400.                     print("Prepare race...\n");
  401.                     PrepareForRace();
  402.                 }
  403.                 else
  404.                 {
  405.                     print("### WARNING KLOD DAY TURN ###\n");
  406.                     DayTurn();
  407.                     SaveDatabase();
  408.                 }
  409.             }
  410.             
  411.         }
  412.         else
  413.         {
  414.             // Yes : wait for end of race
  415.             print("Wait for end of race...\n");
  416.         }
  417.     }
  418. }
  419.  
  420.  
  421.  
  422.  
  423.  
  424. // *********************
  425. // user subscribe
  426. // *********************
  427. func void fnUserSubscribe(i32x _iTeamID)
  428. {
  429.     var Net_Client pClient;
  430.     
  431.     var i32x iUserID;
  432.     var i32x iPreRaceTeamId;
  433.  
  434.     var CBasicUser pdtUserData;
  435.     var CInRaceUser pdtInRaceData;
  436.     
  437.     var Gui_Component pthis;
  438.     var CGuestUser pdtPrimaryData;
  439.     var CSubscribeGuest pdtData;
  440.     pthis = GetThis();
  441.     pdtData = GetData(pthis);
  442.     pdtPrimaryData = GetPrimaryData(pthis);
  443.  
  444.     // get client
  445.     pClient = pdtPrimaryData.m_pClient;
  446.  
  447.     // auto assign
  448.     if (_iTeamID == -1)
  449.     {    
  450.         _iTeamID = Join_FindKeyFromIntData( g_stJoins.m_iTeam_iUserId, 0);
  451.         if (_iTeamID!=-1)
  452.         {
  453.             println("auto assign " + itoa(_iTeamID));
  454.         }
  455.         else
  456.         {
  457.             println("auto assign failed : no team available");
  458.         }
  459.     }
  460.     
  461.     println("<< guest client trying to subscribe team :" + Join_GetStringFromKey(g_stJoins.m_iTeam_szName,_iTeamID ));
  462.     
  463.     // Check if team has no human manager
  464.     if (_iTeamID != -1)
  465.     {
  466.         if (Join_GetIntFromKey( g_stJoins.m_iTeam_iUserId, _iTeamID)==0)
  467.         {
  468.             // subscribe user
  469.             iUserID = fnDBSubscribeUser(pdtPrimaryData.m_szLogin,pdtPrimaryData.m_szPassword,_iTeamID);
  470.             if (iUserID>0)
  471.             {                                
  472.                 // Change client identifier to UserID
  473.                 pdtPrimaryData.m_iUserId= iUserID;
  474.                 
  475.                 // connection in DB
  476.                 Join_SetIntFromKey(    g_stJoins.m_iUser_iConnected, iUserID, 1);
  477.         
  478.                 // inform client
  479.                 pClient << mUser_GameSubscribeOK ( iUserID );
  480.                 
  481.                 // Synchronize client DB
  482.                 Database_SendSynchronization(DATABASE_SERVER);
  483.                 
  484.                 // copy guest data in user data
  485.                 pdtUserData = new CBasicUser;
  486.                 
  487.                 // remove subscribe interface
  488.                 RemoveInterface(pthis);
  489.                 
  490.                 // remove guest interface
  491.                 RemoveInterface(pthis);
  492.  
  493.                 // user interface
  494.                 AddInterface(pthis,iUserInterface,pdtUserData);
  495.                 
  496.                 // inrace ?
  497.                 if(GetGameServerState()==1)
  498.                 {
  499.                     // check that team is inrace
  500.                     iPreRaceTeamId = Join_GetIntFromKey(g_stJoins.m_iUser_iPreRaceTeamId, iUserID);
  501.                     if (iPreRaceTeamId!=-1)
  502.                     {
  503.                         // inrace interface
  504.                         pdtInRaceData = new CInRaceUser;
  505.                         AddInterface(pthis,iInRace,pdtInRaceData);
  506.                         
  507.                         print("Adding client to resolution server.\n");
  508.                         pClient << mUser_InRaceStart(iPreRaceTeamId);
  509.                     }
  510.                     else
  511.                     {
  512.                         print("Team ID "+ itoa(_iTeamID) + " not in race !\n");
  513.                     }
  514.                 }
  515.             }
  516.         }
  517.         else
  518.         {
  519.             // team not free 
  520.             println("Team not free !");
  521.  
  522.             // inform client
  523.             pClient<<mUser_GameSubscribeCancel();
  524.         }
  525.     }
  526. }
  527.  
  528.  
  529. // *********************
  530. // user Unsubscribe
  531. // *********************
  532. func void fnUserUnsubscribeNull()
  533. {
  534. }
  535. func void fnUserUnsubscribe()
  536. {
  537.     var i32x iUserID;
  538.     var i32x iTeamID;
  539.     var i32x iPreRaceTeamId;
  540.  
  541.     var Net_Client pClient;
  542.  
  543.     var CBasicGuest pdtGuestData;
  544.     var CSubscribeGuest pdtSubscribeGuestData;
  545.  
  546.     var Gui_Component pthis;
  547.     var CGuestUser pdtPrimaryData;
  548.     var CBasicUser pdtData;
  549.     pthis = GetThis();
  550.     pdtData = GetData(pthis);
  551.     pdtPrimaryData = GetPrimaryData(pthis);
  552.  
  553.     // Client is a registered user
  554.     iUserID = pdtPrimaryData.m_iUserId;
  555.     
  556.     // Retrieve team id of client
  557.     iTeamID = Join_GetIntFromKey(g_stJoins.m_iUser_iTeamId,iUserID);        
  558.     println("<< client trying to unsubscribe from team :" + Join_GetStringFromKey(g_stJoins.m_iTeam_szName,iTeamID ) + "...");        
  559.  
  560.     // connected user
  561.     pClient = pdtPrimaryData.m_pClient;
  562.                 
  563.     // remove user interface
  564.     RemoveInterface(pthis);
  565.     
  566.     // guest interface
  567.     pdtGuestData = new CBasicGuest;
  568.     AddInterface(pthis,iGuestInterface,pdtGuestData);
  569.     
  570.     // subscibe interface
  571.     pdtSubscribeGuestData = new CSubscribeGuest;
  572.     AddInterface(pthis,iGuestSubscribeInterface,pdtSubscribeGuestData);
  573.                 
  574.     // Inform client
  575.     pClient << mUser_GameUnsubscribeOK();
  576.     
  577.  
  578.     
  579.     fnDBUnsubscribeUser(iUserID);
  580. }
  581.  
  582. func void fnUserInRaceUnsubscribe()
  583. {
  584.     var i32x iUserID;
  585.     var i32x iPreRaceTeamId;
  586.  
  587.     var Gui_Component pthis;
  588.     var CGuestUser pdtPrimaryData;
  589.     var CInRaceUser pdtData;
  590.     pthis = GetThis();
  591.     pdtData = GetData(pthis);
  592.     pdtPrimaryData = GetPrimaryData(pthis);
  593.  
  594.     
  595.     // check that team is inrace
  596.     iPreRaceTeamId = Join_GetIntFromKey(g_stJoins.m_iUser_iPreRaceTeamId, pdtPrimaryData.m_iUserId);
  597.     if (iPreRaceTeamId!=-1)
  598.     {
  599.         // remove inrace interface
  600.         RemoveInterface(pthis);    
  601.     }
  602.     
  603.     
  604.     fnUserUnsubscribe();
  605. }
  606.  
  607.  
  608. // **************************************************************
  609. // * chat
  610. // **************************************************************/
  611. func void fnGame_Chat(i32x _iSendToBitfield, szx _szMessage)
  612. {
  613.     var i32x i;
  614.  
  615.     var i32x iNumClients;
  616.     var Gui_Component pComponent;
  617.     var CGuestUser pdtData;
  618.     var i32x iSendUserId;
  619.  
  620.     var i32x iUserId;
  621.     var Gui_Component pthis;
  622.     var CGuestUser pdtPrimaryData;
  623.     pthis = GetThis();
  624.     pdtPrimaryData = GetPrimaryData(pthis);
  625.     iUserId = pdtPrimaryData.m_iUserId;
  626.     
  627.     i=0;
  628.     iNumClients = GetComponentNumber(g_pAncestorComponent);
  629.     while(i<iNumClients)
  630.     {
  631.         pComponent = GetComponent( g_pAncestorComponent, i);
  632.         if (pComponent)
  633.         {
  634.             pdtData = GetPrimaryData( pComponent);
  635.             iSendUserId = pdtData.m_iUserId;
  636.  
  637.             // only registered user
  638.             if (iSendUserId>0)
  639.             {
  640.                 // broadcast or user
  641.                 if ((GetBit(_iSendToBitfield,0)) || (GetBit(_iSendToBitfield,iSendUserId)))
  642.                 {
  643.                     pdtData.m_pClient << mUser_Chat( iUserId, _szMessage);
  644.                 }
  645.             }
  646.         }
  647.         i=i+1;
  648.     }
  649. }
  650.  
  651.  
  652. // *** database ***
  653. func void fnUserToServerDatabase_Data(szx _szDatabaseName)
  654. {
  655.     var i32x iDatabase;
  656.     
  657.     var Net_Client pClient;
  658.     var i32x iUserID;
  659.     var Gui_Component pthis;
  660.     var CGuestUser pdtPrimaryData;
  661.     pthis = GetThis();
  662.     pdtPrimaryData = GetPrimaryData(pthis);
  663.     iUserID = pdtPrimaryData.m_iUserId;
  664.     pClient  = pdtPrimaryData.m_pClient;
  665.  
  666.     print(_szDatabaseName + " database from user" + itoa(iUserID) + " received\n" );
  667.     
  668.     if (strcmp(_szDatabaseName,"TutuDB")==0)
  669.     {
  670.         iDatabase = Database_Constructor(_szDatabaseName);
  671.         Database_Receive(iDatabase,"ClientDB",pClient);
  672.         
  673.         /// *** ///
  674.         
  675.         Database_Destructor(iDatabase);
  676.     }
  677.     else if (strcmp(_szDatabaseName,"ReadyDB")==0)
  678.     {
  679.         iDatabase = Database_Constructor(_szDatabaseName);
  680.         Database_Receive(iDatabase,"ReadyDB",pClient);
  681.         
  682.         /// Read data
  683.         fnReadDB_Ready(iUserID,iDatabase);
  684.         
  685.         Database_Destructor(iDatabase);
  686.     }
  687.     else if (strcmp(_szDatabaseName,"InviteDB")==0)
  688.     {
  689.         iDatabase = Database_Constructor(_szDatabaseName);
  690.         Database_Receive(iDatabase,"InviteDB",pClient);
  691.         
  692.         /// Read data
  693.         fnReadDB_Invite(iUserID,iDatabase);
  694.         
  695.         Database_Destructor(iDatabase);
  696.     }
  697.     else if (strcmp(_szDatabaseName,"RosterDB")==0)
  698.     {
  699.         var i32x iRet;
  700.         iDatabase = Database_Constructor(_szDatabaseName);
  701.         Database_Receive(iDatabase,"RosterDB",pClient);
  702.  
  703.         /// Read data
  704.         iRet = fnReadDB_Roster(iUserID,iDatabase);
  705.         print("Return:"+itoa(iRet)+"\n");
  706.  
  707.         Database_Destructor(iDatabase);
  708.     }
  709.     else if (strcmp(_szDatabaseName,"StratZone_DB")==0)
  710.     {
  711.         //read strategy zones database
  712.         iDatabase = Database_Constructor(_szDatabaseName);
  713.         Database_Receive(iDatabase,"StratZone_DB",pClient);
  714.         /// Read data
  715.         fnReadDB_StratZone(iUserID,iDatabase);
  716.         Database_Destructor(iDatabase);
  717.     }
  718.     else if (strcmp(_szDatabaseName,"CyclistStrat_DB")==0)
  719.     {
  720.         //read cyclist strategy database
  721.         iDatabase = Database_Constructor(_szDatabaseName);
  722.         Database_Receive(iDatabase,"CyclistStrat_DB",pClient);
  723.         /// Read data
  724.         fnReadDB_CyclistStrat(iUserID,iDatabase);
  725.         Database_Destructor(iDatabase);
  726.     }
  727.     else if (strcmp(_szDatabaseName,"TrainingWeekDB")==0)
  728.     {
  729.         iDatabase = Database_Constructor(_szDatabaseName);
  730.         Database_Receive(iDatabase,"TrainingWeekDB",pClient);
  731.         
  732.         /// Read data
  733.         fnReadDB_TrainingWeek(iUserID,iDatabase);
  734.         
  735.         Database_Destructor(iDatabase);
  736.     }
  737.     else if (strcmp(_szDatabaseName,"TrainingSeasonDB")==0)
  738.     {
  739.         iDatabase = Database_Constructor(_szDatabaseName);
  740.         Database_Receive(iDatabase,"TrainingSeasonDB",pClient);
  741.         
  742.         /// Read data
  743.         fnReadDB_TrainingSeason(iUserID,iDatabase);
  744.         
  745.         Database_Destructor(iDatabase);
  746.     }
  747.     else if (strcmp(_szDatabaseName,"PropositionCyclistDB")==0)
  748.     {
  749.         var i32x iRet;
  750.         iDatabase = Database_Constructor(_szDatabaseName);
  751.         Database_Receive(iDatabase,"PropositionCyclistDB",pClient);
  752.         
  753.         /// Read data
  754.         iRet = fnReadDB_PropositionCyclist(iUserID,iDatabase);
  755.         print("Return:"+itoa(iRet)+"\n");
  756.         
  757.         Database_Destructor(iDatabase);
  758.     }
  759.     else if (strcmp(_szDatabaseName,"PropositionSponsorDB")==0)
  760.     {
  761.         var i32x iRet;
  762.         iDatabase = Database_Constructor(_szDatabaseName);
  763.         Database_Receive(iDatabase,"PropositionSponsorDB",pClient);
  764.         
  765.         /// Read data
  766.         iRet = fnReadDB_PropositionSponsor(iUserID,iDatabase);
  767.         print("Return:"+itoa(iRet)+"\n");
  768.         
  769.         Database_Destructor(iDatabase);
  770.     }
  771.     else if (strcmp(_szDatabaseName,"PropositionLayoffDB")==0)
  772.     {
  773.         var i32x iRet;
  774.         iDatabase = Database_Constructor(_szDatabaseName);
  775.         Database_Receive(iDatabase,"PropositionLayoffDB",pClient);
  776.         
  777.         /// Read data
  778.         iRet = fnReadDB_PropositionLayoff(iUserID,iDatabase);
  779.         print("Return:"+itoa(iRet)+"\n");
  780.         
  781.         Database_Destructor(iDatabase);
  782.     }
  783.     else if (strcmp(_szDatabaseName,"PropositionTransfertDB")==0)
  784.     {
  785.         var i32x iRet;
  786.         iDatabase = Database_Constructor(_szDatabaseName);
  787.         Database_Receive(iDatabase,"PropositionTransfertDB",pClient);
  788.         
  789.         /// Read data
  790.         iRet = fnReadDB_PropositionTransfert(iUserID,iDatabase);
  791.         print("Return:"+itoa(iRet)+"\n");
  792.         
  793.         Database_Destructor(iDatabase);
  794.     }
  795.     else if (strcmp(_szDatabaseName,"StaffRoleDB")==0)
  796.     {
  797.         var i32x iRet;
  798.         iDatabase = Database_Constructor(_szDatabaseName);
  799.         Database_Receive(iDatabase,"StaffRoleDB",pClient);
  800.         
  801.         /// Read data
  802.         iRet = fnReadDB_StaffRole(iUserID,iDatabase);
  803.         print("Return:"+itoa(iRet)+"\n");
  804.         
  805.         Database_Destructor(iDatabase);
  806.     }
  807.     else if (strcmp(_szDatabaseName,"HireStaffDB")==0)
  808.     {
  809.         var i32x iRet;
  810.         iDatabase = Database_Constructor(_szDatabaseName);
  811.         Database_Receive(iDatabase,"HireStaffDB",pClient);
  812.         
  813.         /// Read data
  814.         iRet = fnReadDB_HireStaff(iUserID,iDatabase);
  815.         print("Return:"+itoa(iRet)+"\n");
  816.         
  817.         Database_Destructor(iDatabase);
  818.     }
  819.     else if (strcmp(_szDatabaseName,"LayoffStaffDB")==0)
  820.     {
  821.         var i32x iRet;
  822.         iDatabase = Database_Constructor(_szDatabaseName);
  823.         Database_Receive(iDatabase,"LayoffStaffDB",pClient);
  824.         
  825.         /// Read data
  826.         iRet = fnReadDB_LayoffStaff(iUserID,iDatabase);
  827.         print("Return:"+itoa(iRet)+"\n");
  828.         
  829.         Database_Destructor(iDatabase);
  830.     }
  831.     else if (strcmp(_szDatabaseName,"Cyclist Equipment Selection")==0)
  832.     {
  833.         iDatabase = Database_Constructor(_szDatabaseName);
  834.         Database_Receive(iDatabase,"Cyclist Equipment Selection",pClient);
  835.         /// Read data
  836.         fnReadDB_EquipmentSelection(iUserID,iDatabase);
  837.         Database_Destructor(iDatabase);
  838.     }
  839. }
  840.  
  841. func i32x fnReadDB_Roster(i32x _iUserId,i32x _iDatabase)
  842. {
  843.     var i32x i,iDBTeamId,iDBAnswer,iOk;
  844.     var i32x iNumCyclistsToRegister;
  845.     var szx szTxt,szCyclist,szJoin;
  846.     szCyclist = "fkIDcyclist_";
  847.  
  848.     iDBTeamId = Database_GetIntData(_iDatabase,"DYN_team.IDteam",ROW_INDEX,0);
  849.     iNumCyclistsToRegister = 9;
  850.     if(Join_GetIntFromKey(g_stJoins.m_iUser_iTeamId,_iUserId) == iDBTeamId)
  851.     {
  852.         // Read roster
  853.         iOk = true;
  854.         i=0;
  855.         while(i<iNumCyclistsToRegister)
  856.         {
  857.             szJoin = "DYN_team."+szCyclist+itoa(i+1);
  858.             g_iRoster[i] = Database_GetIntData(_iDatabase,szJoin,ROW_INDEX,0);
  859.             i = i + 1;
  860.         }
  861.  
  862.         // Check roster
  863.         i=0;
  864.         while(i<iNumCyclistsToRegister)
  865.         {
  866.             if(g_iRoster[i]==0)
  867.             {
  868.                 iOk = false;
  869.             }
  870.             else if(Join_GetIntFromKey(g_stJoins.m_iCyclist_iTeamId,g_iRoster[i])!=iDBTeamId)
  871.             {
  872.                 iOk = false;
  873.             }
  874.             i=i+1;
  875.         }
  876.         if(iOk)
  877.         {
  878.             // Update roster
  879.             i=0;
  880.             while(i<iNumCyclistsToRegister)
  881.             {
  882.                 Join_SetIntFromKey(g_stJoins.m_iTeam_iRacerId[i],iDBTeamId,g_iRoster[i]);
  883.                 i = i + 1;
  884.             }
  885.             return 1;
  886.         }
  887.         else
  888.         {
  889.             print("### Invalid RosterDB ###\n");
  890.             return 0;
  891.         }
  892.     }
  893.     print("### Invalid RosterDB ###\n");
  894.     return 0;
  895. }
  896.  
  897. func i32x fnReadDB_StaffRole(i32x _iUserId,i32x _iDatabase)
  898. {
  899.     var i32x iDBTeamId,iDBAnswer;
  900.     var i32x i,iNumRows,iSubset,iJoinStaffRole,iJoinStaffId,iRoleID,iStaffId;
  901.     
  902.     iSubset = Subset_Constructor("STAFFTEAM",_iDatabase);
  903.     Database_AddTables(iSubset,1);
  904.     Table_SetName(iSubset, 0, "DYN_staff");
  905.     TableSubset_SelectColumns(iSubset, 0, "*");
  906.  
  907.     Query_Create(0,iSubset);
  908.     Query_SelectTable(    0, "DYN_staff");
  909.     Query_SelectWhereIntEqual(0,"DYN_staff.fkIDteam", Join_GetIntFromKey(g_stJoins.m_iUser_iTeamId,_iUserId));
  910.     Query_Execute(0);
  911.  
  912.     iJoinStaffId = Join_Constructor(iSubset,"DYN_staff.IDstaff");
  913.     iJoinStaffRole = Join_Constructor(iSubset,"DYN_staff.fkIDstaff_role");
  914.     iNumRows = Join_GetNumRows(iJoinStaffRole);
  915.     i=0;
  916.     while(i<iNumRows)
  917.     {
  918.         iStaffId = Join_GetIntFromIndex(iJoinStaffId,i);
  919.         iRoleID = Join_GetIntFromIndex(iJoinStaffRole,i);
  920.  
  921.         // Update role
  922.         Join_SetIntFromKey(g_stJoins.m_iStaff_iRoleId,iStaffId,iRoleID);
  923.  
  924.         i=i+1;
  925.     }
  926.     Join_Destructor(iJoinStaffId);
  927.     Join_Destructor(iJoinStaffRole);
  928.     Subset_Destructor(iSubset);
  929.  
  930.     if(iNumRows== 0)
  931.         return 0;
  932.  
  933.  
  934.     return 1;
  935. }
  936. func i32x fnReadDB_HireStaff(i32x _iUserId,i32x _iDatabase)
  937. {
  938.     var    i32x iNumRows,iTeamID,iStaffId,iTable,iStaffTeamId;
  939.  
  940.     iTeamID = Join_GetIntFromKey(g_stJoins.m_iUser_iTeamId,_iUserId);
  941.  
  942.     iTable = Table_GetIndexFromName(_iDatabase,"DYN_staff");
  943.     if(iTable>=0)
  944.     {
  945.         iNumRows = Table_GetNumRows(_iDatabase,iTable);
  946.         if(iNumRows>0)
  947.         {
  948.             iStaffId = Database_GetIntData(_iDatabase,"DYN_staff.IDstaff",ROW_INDEX,0);
  949.             iStaffTeamId = Join_GetIntFromKey(g_stJoins.m_iStaff_iTeamId,iStaffId);
  950.             if(iStaffTeamId==LOOSER_TEAM)
  951.             {
  952.                 // Change staff team
  953.                 Join_SetIntFromKey(g_stJoins.m_iStaff_iTeamId,iStaffId,iTeamID);
  954.                 //Synchronize for all clients
  955.                 Database_SendSynchronization(DATABASE_SERVER);
  956.                 return 1;
  957.             }
  958.         }
  959.     }
  960.     return 0;
  961. }
  962. func i32x fnReadDB_LayoffStaff(i32x _iUserId,i32x _iDatabase)
  963. {
  964.     var    i32x iNumRows,iTeamID,iStaffId,iTable,iStaffTeamId;
  965.  
  966.     iTeamID = Join_GetIntFromKey(g_stJoins.m_iUser_iTeamId,_iUserId);
  967.  
  968.     iTable = Table_GetIndexFromName(_iDatabase,"DYN_staff");
  969.     if(iTable>=0)
  970.     {
  971.         iNumRows = Table_GetNumRows(_iDatabase,iTable);
  972.         if(iNumRows>0)
  973.         {
  974.             iStaffId = Database_GetIntData(_iDatabase,"DYN_staff.IDstaff",ROW_INDEX,0);
  975.             iStaffTeamId = Join_GetIntFromKey(g_stJoins.m_iStaff_iTeamId,iStaffId);
  976.             if(iStaffTeamId==iTeamID)
  977.             {
  978.                 // Change staff team
  979.                 Join_SetIntFromKey(g_stJoins.m_iStaff_iTeamId,iStaffId,LOOSER_TEAM);
  980.                 //Synchronize for all clients
  981.                 Database_SendSynchronization(DATABASE_SERVER);
  982.                 return 1;
  983.             }
  984.         }
  985.     }
  986.     return 0;
  987. }
  988. func void fnReadDB_Ready(i32x _iUserId,i32x _iDatabase)
  989. {
  990.     var i32x iDBUserId,iDBVote;
  991.  
  992.     iDBUserId = Database_GetIntData(_iDatabase,"GAM_user.IDuser",ROW_INDEX,0);
  993.  
  994.     if(_iUserId == iDBUserId)
  995.     {
  996.         iDBVote = Database_GetIntData(_iDatabase,"GAM_user.fkIDuser_state",ROW_INDEX,0);
  997.  
  998.         Join_SetIntFromKey(g_stJoins.m_iUser_iState,iDBUserId,iDBVote);
  999.  
  1000.         // Test vote pass
  1001.         fnGameVote_Test();
  1002.     }
  1003.     else
  1004.     {
  1005.         print("### Invalid ReadyDB ###");
  1006.     }
  1007. }
  1008.  
  1009. func void fnReadDB_Invite(i32x _iUserId,i32x _iDatabase)
  1010. {
  1011.     var i32x iDBTeamId,iDBAnswer;
  1012.  
  1013.     iDBTeamId = Database_GetIntData(_iDatabase,"DYN_team.IDteam",ROW_INDEX,0);
  1014.  
  1015.     if(Join_GetIntFromKey(g_stJoins.m_iUser_iTeamId,_iUserId) == iDBTeamId)
  1016.     {
  1017.         // Read answer
  1018.         iDBAnswer = Database_GetIntData(_iDatabase,"DYN_team.game_i_invite_enum",ROW_INDEX,0);
  1019.         // Save answer
  1020.         Join_SetIntFromKey(g_stJoins.m_iTeam_iInviteEnum,iDBTeamId,iDBAnswer);
  1021.         // Make pre race check
  1022.         CheckPreRaceData();
  1023.     }
  1024.     else
  1025.     {
  1026.         print("### Invalid InviteDB ###");
  1027.     }
  1028. }
  1029.  
  1030. func void fnReadDB_StratZone(i32x _iUserId,i32x _iDatabase)
  1031. {
  1032.     var i32x iRowIndex0,iRowIndex1,i,iDeltaNumZones,iSubsetId,iDBTeamId,iLocalZoneStratIDJoin,iServerZoneStratIDJoin,iServerZoneTableIndex,iNumRows,
  1033.     ifkIDstrategic_zone_type,ifkIDstrategy,ifkIDcyclist_ref,ifkIDbehaviour_offense,ifkIDbehaviour_defense,ifkIDsprint,
  1034.     igene_f_distance,igene_b_compete,ifkIDstrategic_zone_type2,ifkIDstrategy2,ifkIDcyclist_ref2,ifkIDbehaviour_offense2,
  1035.     ifkIDbehaviour_defense2,ifkIDsprint2,igene_f_distance2,igene_b_compete2,iIDstrategic_zone2,
  1036.     iServerBehaviourDefenseTableIndex,iIDbehaviour_defense,ifkIDcondition_type,ifkIDcondition_key,ifkIDbehaviour_defense_type,igene_f_condition_value,iIDbehaviour_defense2,
  1037.     ifkIDcondition_type2,ifkIDcondition_key2,ifkIDbehaviour_defense_type2,igene_f_condition_value2,iBehaviourID,iBehaviourID2,iBehaviourIndex2;
  1038.  
  1039.  
  1040.     println("fnReadDB_StratZone");
  1041.     
  1042.     //Database_HTMLDebugPrint(_iDatabase);
  1043.     //Database_HTMLDebugPrint(DATABASE_SERVER);
  1044.     
  1045.     //to verify data on team ID
  1046.     //iDBTeamId=Join_GetIntFromKey(g_stJoins.m_iUser_iTeamId,_iUserId);
  1047.     var i32x iStratId;
  1048.     iStratId = Database_GetIntData(_iDatabase,"DYN_strategic_zone.fkIDstrategy",ROW_INDEX,0); 
  1049.     iDBTeamId = Database_GetIntData(DATABASE_SERVER,"DYN_strategy.fkIDteam",ROW_KEY,iStratId);
  1050.     
  1051.     print("iDBTeamId=");
  1052.     println(itoa(iDBTeamId));
  1053.  
  1054.     // Subset for zone data
  1055.     iSubsetId = Subset_Constructor("SUBSET_STRATEGY_ZONE",DATABASE_SERVER);
  1056.     Database_AddTables(iSubsetId,3);
  1057.     Table_SetName(iSubsetId, 0, "DYN_strategic_zone");
  1058.     TableSubset_SelectColumns(iSubsetId,0,"*");
  1059.     Table_SetName(iSubsetId, 1, "DYN_strategy");
  1060.     TableSubset_SelectColumns(iSubsetId,1,"*");
  1061.     Table_SetName(iSubsetId, 2, "DYN_behaviour_defense");
  1062.     TableSubset_SelectColumns(iSubsetId,2,"*");
  1063.  
  1064.  
  1065.     // Select zones of the current team
  1066.     Query_Create(0,iSubsetId);
  1067.     Query_SelectTable(    0, "DYN_strategic_zone");
  1068.     Query_SelectTable(    0, "DYN_strategic_zone.fkIDstrategy.DYN_strategy");
  1069.     Query_SelectTable(    0, "DYN_strategic_zone.fkIDbehaviour_defense.DYN_behaviour_defense");
  1070.     Query_SelectWhereIntEqual(0,"DYN_strategic_zone.fkIDstrategy.DYN_strategy.fkIDteam", iDBTeamId);
  1071.     Query_Execute(0);
  1072.  
  1073.     //Joins creation
  1074.     iLocalZoneStratIDJoin=Join_Constructor(_iDatabase,"DYN_strategic_zone.fkIDstrategy"); 
  1075.     iServerZoneStratIDJoin=Join_Constructor(iSubsetId,"DYN_strategic_zone.fkIDstrategy"); 
  1076.     iServerZoneTableIndex = Table_GetIndexFromName(iSubsetId,"DYN_strategic_zone");
  1077.     
  1078.     
  1079.     ifkIDstrategic_zone_type=Join_Constructor(_iDatabase,"DYN_strategic_zone.fkIDstrategic_zone_type"); 
  1080.     ifkIDstrategy=Join_Constructor(_iDatabase,"DYN_strategic_zone.fkIDstrategy"); 
  1081.     ifkIDcyclist_ref=Join_Constructor(_iDatabase,"DYN_strategic_zone.fkIDcyclist_ref"); 
  1082.     ifkIDsprint=Join_Constructor(_iDatabase,"DYN_strategic_zone.fkIDsprint"); 
  1083.     igene_f_distance=Join_Constructor(_iDatabase,"DYN_strategic_zone.gene_f_distance"); 
  1084.     igene_b_compete=Join_Constructor(_iDatabase,"DYN_strategic_zone.gene_b_compete");
  1085.     iIDstrategic_zone2=Join_Constructor(iSubsetId,"DYN_strategic_zone.IDstrategic_zone"); 
  1086.  ifkIDstrategic_zone_type2=Join_Constructor(iSubsetId,"DYN_strategic_zone.fkIDstrategic_zone_type"); 
  1087.     ifkIDstrategy2=Join_Constructor(iSubsetId,"DYN_strategic_zone.fkIDstrategy"); 
  1088.     ifkIDcyclist_ref2=Join_Constructor(iSubsetId,"DYN_strategic_zone.fkIDcyclist_ref"); 
  1089.     ifkIDsprint2=Join_Constructor(iSubsetId,"DYN_strategic_zone.fkIDsprint"); 
  1090.     igene_f_distance2=Join_Constructor(iSubsetId,"DYN_strategic_zone.gene_f_distance"); 
  1091.     igene_b_compete2=Join_Constructor(iSubsetId,"DYN_strategic_zone.gene_b_compete");
  1092.  
  1093.     
  1094.     iServerBehaviourDefenseTableIndex = Table_GetIndexFromName(iSubsetId,"DYN_behaviour_defense");
  1095.     ifkIDbehaviour_defense=Join_Constructor(_iDatabase,"DYN_strategic_zone.fkIDbehaviour_defense"); 
  1096.     ifkIDbehaviour_offense=Join_Constructor(_iDatabase,"DYN_strategic_zone.fkIDbehaviour_offense"); 
  1097.     ifkIDbehaviour_defense2=Join_Constructor(iSubsetId,"DYN_strategic_zone.fkIDbehaviour_defense"); 
  1098.     ifkIDbehaviour_offense2=Join_Constructor(iSubsetId,"DYN_strategic_zone.fkIDbehaviour_offense");
  1099.  
  1100.     iIDbehaviour_defense=Join_Constructor(_iDatabase,"DYN_behaviour_defense.IDbehaviour_defense");
  1101.     ifkIDcondition_type=Join_Constructor(_iDatabase,"DYN_behaviour_defense.fkIDcondition_type"); 
  1102.     ifkIDcondition_key=Join_Constructor(_iDatabase,"DYN_behaviour_defense.fkIDcondition_key"); 
  1103.     ifkIDbehaviour_defense_type=Join_Constructor(_iDatabase,"DYN_behaviour_defense.fkIDbehaviour_defense_type"); 
  1104.     igene_f_condition_value=Join_Constructor(_iDatabase,"DYN_behaviour_defense.gene_f_condition_value"); 
  1105.     
  1106.     iIDbehaviour_defense2=Join_Constructor(iSubsetId,"DYN_behaviour_defense.IDbehaviour_defense");
  1107.     ifkIDcondition_type2=Join_Constructor(iSubsetId,"DYN_behaviour_defense.fkIDcondition_type"); 
  1108.     ifkIDcondition_key2=Join_Constructor(iSubsetId,"DYN_behaviour_defense.fkIDcondition_key"); 
  1109.     ifkIDbehaviour_defense_type2=Join_Constructor(iSubsetId,"DYN_behaviour_defense.fkIDbehaviour_defense_type"); 
  1110.     igene_f_condition_value2=Join_Constructor(iSubsetId,"DYN_behaviour_defense.gene_f_condition_value"); 
  1111.     
  1112.  
  1113.     //Verify data validity
  1114.     /*i=0;
  1115.     iNumRows=Join_GetNumRows(iLocalZoneStratIDJoin);
  1116.     while(i<iNumRows)
  1117.     {
  1118.         Join_GetIntFromIndex(,i);
  1119.         i=i+1;
  1120.     }*/
  1121.  
  1122.  
  1123.     //Dynamic data creation
  1124.     iDeltaNumZones=Join_GetNumRows(iServerZoneStratIDJoin)-Join_GetNumRows(iLocalZoneStratIDJoin);
  1125.  
  1126.     print("iDeltaNumZones=");
  1127.     println(itoa(iDeltaNumZones));
  1128.  
  1129.     if(iDeltaNumZones>0)
  1130.     {
  1131.         //delete zones
  1132.         i=0;
  1133.         while(i<iDeltaNumZones)
  1134.         {
  1135.             Table_DeleteRowFromIndex(iSubsetId,iServerBehaviourDefenseTableIndex,i);
  1136.             Table_DeleteRowFromIndex(iSubsetId,iServerZoneTableIndex,i);
  1137.             i=i+1;
  1138.         }
  1139.         Database_DeleteNow(DATABASE_SERVER);
  1140.     }
  1141.     else if(iDeltaNumZones<0)
  1142.     {
  1143.         i=0;
  1144.         while(i<-iDeltaNumZones)
  1145.         {
  1146.             //create zones
  1147.             Table_AddRow(iSubsetId,iServerZoneTableIndex);
  1148.             Table_AddRow(iSubsetId,iServerBehaviourDefenseTableIndex);
  1149.             i=i+1;
  1150.         }
  1151.     }
  1152.     
  1153.  
  1154.     iNumRows=Join_GetNumRows(iLocalZoneStratIDJoin);
  1155.     //println
  1156.     
  1157.     //Copy data in database
  1158.     i=0;
  1159.     while(i<iNumRows)
  1160.     {
  1161.         Join_SetIntFromIndex(ifkIDstrategy2,i,Join_GetIntFromIndex(ifkIDstrategy,i));
  1162.  
  1163.         Join_SetIntFromIndex(ifkIDbehaviour_defense2,i,Join_GetIntFromIndex(iIDbehaviour_defense2,i));//Dynamic keys generated on server
  1164.         Join_SetIntFromIndex(ifkIDbehaviour_offense2,i,Join_GetIntFromIndex(ifkIDbehaviour_offense,i));//static keys from 1 to 3 read from receidved DB
  1165.         
  1166.         Join_SetIntFromIndex(ifkIDstrategic_zone_type2,i,Join_GetIntFromIndex(ifkIDstrategic_zone_type,i));
  1167.         Join_SetIntFromIndex(ifkIDcyclist_ref2,i,Join_GetIntFromIndex(ifkIDcyclist_ref,i));
  1168.         Join_SetIntFromIndex(ifkIDsprint2,i,Join_GetIntFromIndex(ifkIDsprint,i));
  1169.         Join_SetFloatFromIndex(igene_f_distance2,i,Join_GetFloatFromIndex(igene_f_distance,i));
  1170.         Join_SetIntFromIndex(igene_b_compete2,i,Join_GetIntFromIndex(igene_b_compete,i));
  1171.  
  1172.         iBehaviourID=Join_GetIntFromKey(iIDbehaviour_defense,Join_GetIntFromIndex(ifkIDbehaviour_defense,i));
  1173.         iBehaviourID2=Join_GetIntFromIndex(ifkIDbehaviour_defense2,i);
  1174.  
  1175.         Join_SetIntFromKey(ifkIDcondition_type2,iBehaviourID2,Join_GetIntFromKey(ifkIDcondition_type,iBehaviourID));
  1176.         Join_SetIntFromKey(ifkIDcondition_key2,iBehaviourID2,Join_GetIntFromKey(ifkIDcondition_key,iBehaviourID));
  1177.         Join_SetIntFromKey(ifkIDbehaviour_defense_type2,iBehaviourID2,Join_GetIntFromKey(ifkIDbehaviour_defense_type,iBehaviourID));
  1178.         Join_SetFloatFromKey(igene_f_condition_value2,iBehaviourID2,Join_GetFloatFromKey(igene_f_condition_value,iBehaviourID));
  1179.         
  1180.         i=i+1;
  1181.     }
  1182.     
  1183.     
  1184.     //Database_HTMLDebugPrint(iSubsetId);
  1185.     
  1186.     //Synchronize for all clients
  1187.     //Database_SendSynchronization(DATABASE_SERVER);
  1188.     //Database_HTMLDebugPrint(DATABASE_SERVER);
  1189.     
  1190.     i=0;
  1191.     print("iNumRows=");
  1192.     println(itoa(iNumRows));
  1193.     //Database_HTMLDebugPrint(iSubsetId);
  1194.     while(i<iNumRows)
  1195.     {
  1196.         print("Zone index:");
  1197.         println(itoa(i));
  1198.         
  1199.         print("Zone ID:");
  1200.         println(itoa(Join_GetIntFromIndex(iIDstrategic_zone2,i)));
  1201.  
  1202.         print("Strategy ID:");
  1203.         println(itoa(Join_GetIntFromIndex(ifkIDstrategy2,i)));
  1204.  
  1205.         print("Type:");
  1206.         println(itoa(Join_GetIntFromIndex(ifkIDstrategic_zone_type2,i)));
  1207.         
  1208.         print("igene_f_distance:");
  1209.         println(ftoa(Join_GetFloatFromIndex(igene_f_distance2,i)));
  1210.  
  1211.         if(Join_GetIntFromIndex(ifkIDstrategic_zone_type2,i)==2)
  1212.         {
  1213.             print("ifkIDsprint2:");
  1214.             println(itoa(Join_GetIntFromIndex(ifkIDsprint2,i)));
  1215.  
  1216.             print("igene_b_compete2:");
  1217.             println(itoa(Join_GetIntFromIndex(igene_b_compete2,i)));
  1218.      }
  1219.         else
  1220.         {
  1221.             print("ifkIDcyclist_ref2:");
  1222.             println(itoa(Join_GetIntFromIndex(ifkIDcyclist_ref2,i)));
  1223.  
  1224.             print("ifkIDbehaviour_defense2:");
  1225.             println(itoa(Join_GetIntFromIndex(ifkIDbehaviour_defense2,i)));
  1226.             
  1227.             iBehaviourID2=Join_GetIntFromIndex(ifkIDbehaviour_defense2,i);
  1228.     
  1229.             print("ifkIDcondition_type2:");
  1230.             println(itoa(Join_GetIntFromKey(ifkIDcondition_type2,iBehaviourID2)));
  1231.  
  1232.             print("ifkIDcondition_key2:");
  1233.             println(itoa(Join_GetIntFromKey(ifkIDcondition_key2,iBehaviourID2)));
  1234.             
  1235.             print("ifkIDbehaviour_defense_type2:");
  1236.             println(itoa(Join_GetIntFromKey(ifkIDbehaviour_defense_type2,iBehaviourID2)));
  1237.             
  1238.             print("igene_f_condition_value2:");
  1239.             println(ftoa(Join_GetFloatFromKey(igene_f_condition_value2,iBehaviourID2)));
  1240.             
  1241.  
  1242.             print("ifkIDbehaviour_offense2:");
  1243.             println(itoa(Join_GetIntFromIndex(ifkIDbehaviour_offense2,i)));
  1244.         }
  1245.  
  1246.         i=i+1;
  1247.     }
  1248.  
  1249.     //Delete joins and subset
  1250.     if(iIDstrategic_zone2) Join_Destructor(iIDstrategic_zone2); 
  1251.     if(igene_f_condition_value2) Join_Destructor(igene_f_condition_value2); 
  1252.     if(ifkIDbehaviour_defense_type2) Join_Destructor(ifkIDbehaviour_defense_type2); 
  1253.     if(ifkIDcondition_key2) Join_Destructor(ifkIDcondition_key2); 
  1254.     if(ifkIDcondition_type2) Join_Destructor(ifkIDcondition_type2); 
  1255.     if(iIDbehaviour_defense2) Join_Destructor(iIDbehaviour_defense2); 
  1256.     if(igene_f_condition_value) Join_Destructor(igene_f_condition_value); 
  1257.     if(ifkIDbehaviour_defense_type) Join_Destructor(ifkIDbehaviour_defense_type); 
  1258.     if(ifkIDcondition_key) Join_Destructor(ifkIDcondition_key); 
  1259.     if(ifkIDcondition_type) Join_Destructor(ifkIDcondition_type); 
  1260.     if(iIDbehaviour_defense) Join_Destructor(iIDbehaviour_defense); 
  1261.  
  1262.     if(igene_b_compete2) Join_Destructor(igene_b_compete2); 
  1263.     if(igene_f_distance2) Join_Destructor(igene_f_distance2); 
  1264.     if(ifkIDsprint2) Join_Destructor(ifkIDsprint2); 
  1265.     if(ifkIDbehaviour_defense2) Join_Destructor(ifkIDbehaviour_defense2); 
  1266.     if(ifkIDbehaviour_offense2) Join_Destructor(ifkIDbehaviour_offense2); 
  1267.     if(ifkIDcyclist_ref2) Join_Destructor(ifkIDcyclist_ref2); 
  1268.     if(ifkIDstrategy2) Join_Destructor(ifkIDstrategy2);
  1269.     if(ifkIDstrategic_zone_type2) Join_Destructor(ifkIDstrategic_zone_type2);
  1270.     
  1271.     if(igene_b_compete) Join_Destructor(igene_b_compete); 
  1272.     if(igene_f_distance) Join_Destructor(igene_f_distance); 
  1273.     if(ifkIDsprint) Join_Destructor(ifkIDsprint); 
  1274.     if(ifkIDbehaviour_defense) Join_Destructor(ifkIDbehaviour_defense); 
  1275.     if(ifkIDbehaviour_offense) Join_Destructor(ifkIDbehaviour_offense); 
  1276.     if(ifkIDcyclist_ref) Join_Destructor(ifkIDcyclist_ref); 
  1277.     if(ifkIDstrategy) Join_Destructor(ifkIDstrategy);
  1278.     if(ifkIDstrategic_zone_type) Join_Destructor(ifkIDstrategic_zone_type);
  1279.     
  1280.     if(iServerZoneStratIDJoin) Join_Destructor(iServerZoneStratIDJoin);
  1281.     if(iLocalZoneStratIDJoin) Join_Destructor(iLocalZoneStratIDJoin);
  1282.     if(iSubsetId) Subset_Destructor(iSubsetId);
  1283. }
  1284.  
  1285. func void fnReadDB_CyclistStrat(i32x _iUserId,i32x _iDatabase)
  1286. {
  1287.     var i32x i,iNumRows,iDBTeamId,iLocalCyclistIDJoin,iLocalCyclistStratIDJoin,iServerCyclistStratIDJoin;
  1288.  
  1289.     println("fnReadDB_CyclistStrat");
  1290.  
  1291.     //to verify data on team ID
  1292.     //iDBTeamId=Join_GetIntFromKey(g_stJoins.m_iUser_iTeamId,_iUserId);
  1293.     iDBTeamId = Database_GetIntData(_iDatabase,"DYN_cyclist.fkIDteam",ROW_INDEX,0);
  1294.     
  1295.     print("iDBTeamId=");
  1296.     println(itoa(iDBTeamId));
  1297.  
  1298.     //Joins creation
  1299.     iLocalCyclistIDJoin=Join_Constructor(_iDatabase,"DYN_cyclist.IDcyclist"); 
  1300.     iLocalCyclistStratIDJoin=Join_Constructor(_iDatabase,"DYN_cyclist.fkIDstrategic_group"); 
  1301.     iServerCyclistStratIDJoin=Join_Constructor(DATABASE_SERVER,"DYN_cyclist.fkIDstrategic_group"); 
  1302.     
  1303.     //Database_HTMLDebugPrint(_iDatabase);
  1304.  
  1305.     //Copy data in database
  1306.     i=0;
  1307.     iNumRows=Join_GetNumRows(iLocalCyclistStratIDJoin);
  1308.     println("iNumRows="+itoa(iNumRows));
  1309.     while(i<iNumRows)
  1310.     {
  1311.         println("Cyclist "+itoa(i)+"Strat Id="+itoa(Join_GetIntFromIndex(iLocalCyclistStratIDJoin,i)));
  1312.         Join_SetIntFromKey(iServerCyclistStratIDJoin,Join_GetIntFromIndex(iLocalCyclistIDJoin,i),Join_GetIntFromIndex(iLocalCyclistStratIDJoin,i));
  1313.         i=i+1;
  1314.     }
  1315.     //Synchronize for all clients
  1316.     Database_SendSynchronization(DATABASE_SERVER);
  1317.     //Database_HTMLDebugPrint(DATABASE_SERVER);
  1318.  
  1319.     //delete joins
  1320.     if(iServerCyclistStratIDJoin) Join_Destructor(iServerCyclistStratIDJoin);
  1321.     if(iLocalCyclistStratIDJoin) Join_Destructor(iLocalCyclistStratIDJoin);
  1322.     if(iLocalCyclistIDJoin) Join_Destructor(iLocalCyclistIDJoin);
  1323.  
  1324.     SaveDatabase();
  1325. }
  1326.  
  1327. func void fnReadDB_EquipmentSelection(i32x _iUserId,i32x _iDatabase)
  1328. {
  1329.     var i32x i,iDBTeamId,iNumRows,iEquipmentID,iEquipmentSelectionJoin,iFrameJoin,iHelmetJoin,iFrontWheelJoin,iRearWheelJoin,
  1330.     iServerFrameJoin,iServerHelmetJoin,iServerFrontWheelJoin,iServerRearWheelJoin;
  1331.  
  1332.     println("fnReadDB_EquipmentSelection");
  1333.  
  1334.     //to verify data on team ID
  1335.     iDBTeamId=Join_GetIntFromKey(g_stJoins.m_iUser_iTeamId,_iUserId);
  1336.     
  1337.     print("iDBTeamId=");
  1338.     println(itoa(iDBTeamId));
  1339.  
  1340.     //Joins creation
  1341.     iEquipmentSelectionJoin=Join_Constructor(_iDatabase,"DYN_equipment_selection.IDequipment_selection"); 
  1342.     iFrameJoin=Join_Constructor(_iDatabase,"DYN_equipment_selection.fkIDequipment_frame"); 
  1343.     iHelmetJoin=Join_Constructor(_iDatabase,"DYN_equipment_selection.fkIDequipment_helmet"); 
  1344.     iFrontWheelJoin=Join_Constructor(_iDatabase,"DYN_equipment_selection.fkIDequipment_front_wheel"); 
  1345.     iRearWheelJoin=Join_Constructor(_iDatabase,"DYN_equipment_selection.fkIDequipment_rear_wheel"); 
  1346.     
  1347.     iServerFrameJoin=Join_Constructor(DATABASE_SERVER,"DYN_equipment_selection.fkIDequipment_frame"); 
  1348.     iServerHelmetJoin=Join_Constructor(DATABASE_SERVER,"DYN_equipment_selection.fkIDequipment_helmet"); 
  1349.     iServerFrontWheelJoin=Join_Constructor(DATABASE_SERVER,"DYN_equipment_selection.fkIDequipment_front_wheel"); 
  1350.     iServerRearWheelJoin=Join_Constructor(DATABASE_SERVER,"DYN_equipment_selection.fkIDequipment_rear_wheel"); 
  1351.     
  1352.  
  1353.     //Copy data in database
  1354.     i=0;
  1355.     iNumRows=Join_GetNumRows(iEquipmentSelectionJoin);
  1356.     while(i<iNumRows)
  1357.     {
  1358.         iEquipmentID=Join_GetIntFromIndex(iEquipmentSelectionJoin,i);
  1359.         Join_SetIntFromKey(iServerFrameJoin,iEquipmentID,Join_GetIntFromKey(iFrameJoin,iEquipmentID));
  1360.         Join_SetIntFromKey(iServerHelmetJoin,iEquipmentID,Join_GetIntFromKey(iHelmetJoin,iEquipmentID));
  1361.         Join_SetIntFromKey(iServerFrontWheelJoin,iEquipmentID,Join_GetIntFromKey(iFrontWheelJoin,iEquipmentID));
  1362.         Join_SetIntFromKey(iServerRearWheelJoin,iEquipmentID,Join_GetIntFromKey(iRearWheelJoin,iEquipmentID));
  1363.         i=i+1;
  1364.     }
  1365.  
  1366.     //Synchronize for all clients
  1367.     Database_SendSynchronization(DATABASE_SERVER);
  1368.     //Database_HTMLDebugPrint(DATABASE_SERVER);
  1369.  
  1370.     //delete joins
  1371.     if(iEquipmentSelectionJoin) Join_Destructor(iEquipmentSelectionJoin);
  1372.     if(iFrameJoin) Join_Destructor(iFrameJoin);
  1373.     if(iHelmetJoin) Join_Destructor(iHelmetJoin);
  1374.     if(iFrontWheelJoin) Join_Destructor(iFrontWheelJoin);
  1375.     if(iRearWheelJoin) Join_Destructor(iRearWheelJoin);
  1376.     if(iServerFrameJoin) Join_Destructor(iServerFrameJoin);
  1377.     if(iServerHelmetJoin) Join_Destructor(iServerHelmetJoin);
  1378.     if(iServerFrontWheelJoin) Join_Destructor(iServerFrontWheelJoin);
  1379.     if(iServerRearWheelJoin) Join_Destructor(iServerRearWheelJoin);
  1380. }
  1381.  
  1382.  
  1383.  
  1384.  
  1385.  
  1386.  
  1387. // ========== training week function ===================
  1388.  
  1389. func szx GetDayColumnEnd(i32x _iColumnIndex);
  1390.  
  1391. func void RemoveTrainingDayProgram(i32x _iSubset,i32x _iIDDayProgram)
  1392. {
  1393.     var i32x iTableIndex;
  1394.  
  1395.     // removes the row
  1396.     iTableIndex=Table_GetIndexFromName(_iSubset,"DYN_training_day_program");
  1397.     Table_DeleteRowFromKey(_iSubset,iTableIndex,_iIDDayProgram);
  1398.     // updates the database
  1399.     Database_DeleteNow(_iSubset);
  1400. }
  1401.  
  1402. func void RemoveTrainingDay(i32x _iSubset,i32x _iIDDay)
  1403. {
  1404.     var i32x iQuerySubset;
  1405.     var i32x i,iNumRows,iIDDayProgram;
  1406.     var i32x iTableIndex;
  1407.  
  1408.     // creates a subset for a query
  1409.     iQuerySubset=Subset_Constructor("",_iSubset);
  1410.     Database_AddTables(iQuerySubset,1);
  1411.     Table_SetName(iQuerySubset,0,"DYN_training_day_program");
  1412.     TableSubset_SelectColumns(iQuerySubset,0,"*");
  1413.     
  1414.     // looks for all the "training_day_program" records of the day
  1415.     Query_Create(0,iQuerySubset);
  1416.     Query_SelectTable(0,"DYN_training_day_program");
  1417.     Query_SelectWhereIntEqual(0,"DYN_training_day_program.fkIDtraining_day",_iIDDay);
  1418.     Query_Execute(0);
  1419.  
  1420.     // for each found row
  1421.     iNumRows=Table_GetNumRows(iQuerySubset,0);
  1422.     i=0;
  1423.     while (i<iNumRows)
  1424.     {
  1425.         // removes the training day program
  1426.         iIDDayProgram=Database_GetIntData(iQuerySubset,"DYN_training_day_program.IDtraining_day_program",ROW_INDEX,i);
  1427.         RemoveTrainingDayProgram(_iSubset,iIDDayProgram);
  1428.         i=i+1;
  1429.     }
  1430.  
  1431.     // removes the training day
  1432.     iTableIndex=Table_GetIndexFromName(_iSubset,"DYN_training_day");
  1433.     Table_DeleteRowFromKey(_iSubset,iTableIndex,_iIDDay);
  1434.     Database_DeleteNow(_iSubset);
  1435.  
  1436.     Subset_Destructor(iQuerySubset);
  1437. }
  1438.  
  1439. func void RemoveTrainingWeekData(i32x _iSubset,i32x _iIDWeek)
  1440. {
  1441.     var i32x i;
  1442.     var i32x iIDDay;
  1443.  
  1444.     // for each day of the week
  1445.     i=0;
  1446.     while (i<7)
  1447.     {
  1448.         // removes the day
  1449.         iIDDay=Database_GetIntData(_iSubset,"DYN_training_week.fkIDtraining_day_"+GetDayColumnEnd(i),ROW_KEY,_iIDWeek);
  1450.         RemoveTrainingDay(_iSubset,iIDDay);
  1451.  
  1452.         i=i+1;
  1453.     }
  1454. }
  1455.  
  1456. func void RemoveTrainingWeek(i32x _iSubset,i32x _iIDWeek)
  1457. {
  1458.     var i32x iTableIndex;
  1459.  
  1460.     // removes all the days of the week
  1461.     RemoveTrainingWeekData(_iSubset,_iIDWeek);
  1462.  
  1463.     // removes the week
  1464.     iTableIndex=Table_GetIndexFromName(_iSubset,"DYN_training_week");
  1465.     Table_DeleteRowFromKey(_iSubset,iTableIndex,_iIDWeek);
  1466.     Database_DeleteNow(DATABASE_SERVER);
  1467. }
  1468.  
  1469.  
  1470. func void CopyTrainingDayProgram(i32x _iSourceSubset,i32x _iSourceKey,i32x _iDestinationSubset,i32x _iDestinationKey)
  1471. {
  1472.     var i32x iQuerySubset;
  1473.     var i32x iTableIndex;
  1474.     var i32x iDayProgramRow;
  1475.     var i32x iIDDayProgram;
  1476.     var i32x iIDProgram;
  1477.     var i32x iNumRows,i;
  1478.  
  1479.     // creates a subset for a query
  1480.     iQuerySubset=Subset_Constructor("SUBSET_TRAINING_DAY_PROGRAM",_iSourceSubset);
  1481.     Database_AddTables(iQuerySubset,1);
  1482.     Table_SetName(iQuerySubset,0,"DYN_training_day_program");
  1483.     TableSubset_SelectColumns(iQuerySubset,0,"*");
  1484.     
  1485.     // looks for all the "training_day_program" in the source subset linked to the source key of the day
  1486.     Query_Create(0,iQuerySubset);
  1487.     Query_SelectTable(0,"DYN_training_day_program");
  1488.     Query_SelectWhereIntEqual(0,"DYN_training_day_program.fkIDtraining_day",_iSourceKey);
  1489.     Query_Execute(0);
  1490.  
  1491.     iNumRows=Table_GetNumRows(iQuerySubset,0);
  1492.     i=0;
  1493.     while (i<iNumRows)
  1494.     {
  1495.         // create a new "training_day_program" row
  1496.         iTableIndex=Table_GetIndexFromName(_iDestinationSubset,"DYN_training_day_program");
  1497.         iDayProgramRow=Table_AddRow(_iDestinationSubset,iTableIndex);
  1498.         iIDDayProgram=Database_GetIntData(_iDestinationSubset,"DYN_training_day_program.IDtraining_day_program",ROW_INDEX,iDayProgramRow);
  1499.  
  1500.         iIDProgram=Database_GetIntData(iQuerySubset,"DYN_training_day_program.fkIDprogram",ROW_INDEX,i);
  1501.  
  1502.         // updates the data of the row
  1503.         Database_SetIntData(_iDestinationSubset,"DYN_training_day_program.fkIDtraining_day",ROW_KEY,iIDDayProgram,_iDestinationKey);
  1504.         Database_SetIntData(_iDestinationSubset,"DYN_training_day_program.fkIDprogram",ROW_KEY,iIDDayProgram,iIDProgram);
  1505.  
  1506.         i=i+1;
  1507.     }
  1508.  
  1509.     Subset_Destructor(iQuerySubset);
  1510. }
  1511.  
  1512. func i32x CopyTrainingDay(i32x _iSourceSubset,i32x _iSourceKey,i32x _iDestinationSubset)
  1513. {
  1514.     var i32x iTableIndex;
  1515.     var i32x iDayRow;
  1516.     var i32x iIDDay;
  1517.     var i32x bDietFirst;
  1518.  
  1519.     // create a new row
  1520.     iTableIndex=Table_GetIndexFromName(_iDestinationSubset,"DYN_training_day");
  1521.     iDayRow=Table_AddRow(_iDestinationSubset,iTableIndex);
  1522.     iIDDay=Database_GetIntData(_iDestinationSubset,"DYN_training_day.IDtraining_day",ROW_INDEX,iDayRow);
  1523.  
  1524.     // copy all the training programs
  1525.     CopyTrainingDayProgram(_iSourceSubset,_iSourceKey,_iDestinationSubset,iIDDay);
  1526.  
  1527.     // gets the data of the source...
  1528.     bDietFirst=Database_GetIntData(_iSourceSubset,"DYN_training_day.gene_b_1st_program_diet",ROW_KEY,_iSourceKey);
  1529.  
  1530.     // ... and puts it in the destination
  1531.     Database_SetIntData(_iDestinationSubset,"DYN_training_day.gene_b_1st_program_diet",ROW_KEY,iIDDay,bDietFirst);
  1532.  
  1533.     // returns the ID of the new row
  1534.     return(iIDDay);
  1535. }
  1536.  
  1537. func void CopyTrainingWeek(i32x _iSourceSubset,i32x _iSourceKey,i32x _iDestinationSubset,i32x _iDestinationKey)
  1538. {
  1539.     var i32x i;
  1540.     var i32x iIDDay;
  1541.     var i32x iIDNewDay;
  1542.  
  1543.     // for each day of the week
  1544.     i=0;
  1545.     while (i<7)
  1546.     {
  1547.         iIDDay=Database_GetIntData(_iSourceSubset,"DYN_training_week.fkIDtraining_day_"+GetDayColumnEnd(i),ROW_KEY,_iSourceKey);
  1548.         // copy the day from the source to the destination
  1549.         iIDNewDay=CopyTrainingDay(_iSourceSubset,iIDDay,_iDestinationSubset);
  1550.         // the new day is linked tothe week
  1551.         Database_SetIntData(_iDestinationSubset,"DYN_training_week.fkIDtraining_day_"+GetDayColumnEnd(i),ROW_KEY,_iDestinationKey,iIDNewDay);
  1552.     
  1553.         i=i+1;
  1554.     }
  1555.  
  1556.     var i32x iIDColor;
  1557.     var i32x iIDTeam;
  1558.     var szx szWeekName;
  1559.  
  1560.     // gets the source values
  1561.     iIDColor=Database_GetIntData(_iSourceSubset,"DYN_training_week.fkIDcolor",ROW_KEY,_iSourceKey);
  1562.     iIDTeam=Database_GetIntData(_iSourceSubset,"DYN_training_week.fkIDteam",ROW_KEY,_iSourceKey);
  1563.     szWeekName=Database_GetStringData(_iSourceSubset,"DYN_training_week.gene_sz_name",ROW_KEY,_iSourceKey);
  1564.  
  1565.     // puts them in the destination
  1566.     Database_SetIntData(_iDestinationSubset,"DYN_training_week.fkIDcolor",ROW_KEY,_iDestinationKey,iIDColor);
  1567.     Database_SetIntData(_iDestinationSubset,"DYN_training_week.fkIDteam",ROW_KEY,_iDestinationKey,iIDTeam);
  1568.     Database_SetStringData(_iDestinationSubset,"DYN_training_week.gene_sz_name",ROW_KEY,_iDestinationKey,szWeekName);
  1569.     Database_SetStringData(_iDestinationSubset,"DYN_training_week.gene_sz_displayed_name",ROW_KEY,_iDestinationKey,szWeekName);
  1570. }
  1571.  
  1572. func void CreateTrainingWeek(i32x _iSourceSubset,i32x _iSourceKey,i32x _iDestinationSubset)
  1573. {
  1574.     var i32x iTableIndex;
  1575.     var i32x iIDWeek,iWeekRow;
  1576.  
  1577.     // creates a new row
  1578.     iTableIndex=Table_GetIndexFromName(_iDestinationSubset,"DYN_training_week");
  1579.     iWeekRow=Table_AddRow(_iDestinationSubset,iTableIndex);
  1580.     iIDWeek=Database_GetIntData(_iDestinationSubset,"DYN_training_week.IDtraining_week",ROW_INDEX,iWeekRow);
  1581.  
  1582.     // copy the source week in the new one
  1583.     CopyTrainingWeek(_iSourceSubset,_iSourceKey,_iDestinationSubset,iIDWeek);
  1584. }
  1585.  
  1586. func void UpdateTrainingWeek(i32x _iSourceSubset,i32x _iSourceKey,i32x _iDestinationSubset,i32x _iDestinationKey)
  1587. {
  1588.     // removes the old data of the week
  1589.     RemoveTrainingWeekData(_iDestinationSubset,_iDestinationKey);
  1590.     // copy the source week in the empty one
  1591.     CopyTrainingWeek(_iSourceSubset,_iSourceKey,_iDestinationSubset,_iDestinationKey);
  1592. }
  1593.  
  1594. // ========== the end ===================
  1595.  
  1596.  
  1597. func void fnReadDB_TrainingWeek(i32x _iUserId,i32x _iDatabase)
  1598. {
  1599.     var i32x iQueryServerSubset;
  1600.     var i32x iQueryReceivedSubset;
  1601.     var i32x iDBTeamId;
  1602.     var i32x i,iNumRows;
  1603.     var i32x iServerIDWeek,iReceivedIDWeek;
  1604.     var i32x iWeekNameJoin;
  1605.     var szx szReceivedWeekName,szServerWeekName;
  1606.  
  1607.     iDBTeamId=Join_GetIntFromKey(g_stJoins.m_iUser_iTeamId,_iUserId);
  1608.  
  1609.     iQueryServerSubset=Subset_Constructor("WEEK_SYNCHRONISATION_SERVER_QUERY",DATABASE_SERVER);
  1610.     Database_AddTables(iQueryServerSubset,1);
  1611.     Table_SetName(iQueryServerSubset,0,"DYN_training_week");
  1612.     TableSubset_SelectColumns(iQueryServerSubset,0,"*");
  1613.     
  1614.     Query_Create(0,iQueryServerSubset);
  1615.     Query_SelectTable(0,"DYN_training_week");
  1616.     Query_SelectWhereIntEqual(0,"DYN_training_week.fkIDteam",iDBTeamId);
  1617.     Query_Execute(0);
  1618.  
  1619.     iQueryReceivedSubset=Subset_Constructor("WEEK_SYNCHRONISATION_RECEIVED_QUERY",_iDatabase);
  1620.     Database_AddTables(iQueryReceivedSubset,1);
  1621.     Table_SetName(iQueryReceivedSubset,0,"DYN_training_week");
  1622.     TableSubset_SelectColumns(iQueryReceivedSubset,0,"*");
  1623.  
  1624.     Query_Create(0,iQueryReceivedSubset);
  1625.     Query_SelectTable(0,"DYN_training_week");
  1626.     Query_SelectWhereIntEqual(0,"DYN_training_week.fkIDteam",iDBTeamId);
  1627.     Query_Execute(0);
  1628.  
  1629. // week synchronisation : delete
  1630.     iWeekNameJoin=Join_Constructor(iQueryReceivedSubset,"DYN_training_week.gene_sz_name");
  1631.  
  1632.     iNumRows=Table_GetNumRows(iQueryServerSubset,0);
  1633.     i=0;
  1634.     while (i<iNumRows)
  1635.     {
  1636.         szServerWeekName=Database_GetStringData(iQueryServerSubset,"DYN_training_week.gene_sz_name",ROW_INDEX,i);
  1637.         iReceivedIDWeek=Join_FindKeyFromStringData(iWeekNameJoin,szServerWeekName);
  1638.  
  1639.         if (iReceivedIDWeek==-1)
  1640.         {
  1641.             iServerIDWeek=Database_GetIntData(iQueryServerSubset,"DYN_training_week.IDtraining_week",ROW_INDEX,i);
  1642.             RemoveTrainingWeek(DATABASE_SERVER,iServerIDWeek);
  1643.             i=i-1;
  1644.             iNumRows=iNumRows-1;
  1645.         }
  1646.         
  1647.         i=i+1;
  1648.     }
  1649.  
  1650.     Join_Destructor(iWeekNameJoin);
  1651. // week synchronized : delete
  1652.  
  1653.     // ****************************************************************
  1654.     // version un peu glauque: on reexecute les query sinon ca plante
  1655.     // quand on efface et rajoute une semaine a la fois!!!!
  1656.     // ****************************************************************
  1657.  
  1658.     Subset_Destructor(iQueryServerSubset);
  1659.     Subset_Destructor(iQueryReceivedSubset);
  1660.  
  1661.     iQueryServerSubset=Subset_Constructor("WEEK_SYNCHRONISATION_SERVER_QUERY",DATABASE_SERVER);
  1662.     Database_AddTables(iQueryServerSubset,1);
  1663.     Table_SetName(iQueryServerSubset,0,"DYN_training_week");
  1664.     TableSubset_SelectColumns(iQueryServerSubset,0,"*");
  1665.     
  1666.     Query_Create(0,iQueryServerSubset);
  1667.     Query_SelectTable(0,"DYN_training_week");
  1668.     Query_SelectWhereIntEqual(0,"DYN_training_week.fkIDteam",iDBTeamId);
  1669.     Query_Execute(0);
  1670.  
  1671.     iQueryReceivedSubset=Subset_Constructor("WEEK_SYNCHRONISATION_RECEIVED_QUERY",_iDatabase);
  1672.     Database_AddTables(iQueryReceivedSubset,1);
  1673.     Table_SetName(iQueryReceivedSubset,0,"DYN_training_week");
  1674.     TableSubset_SelectColumns(iQueryReceivedSubset,0,"*");
  1675.  
  1676.     Query_Create(0,iQueryReceivedSubset);
  1677.     Query_SelectTable(0,"DYN_training_week");
  1678.     Query_SelectWhereIntEqual(0,"DYN_training_week.fkIDteam",iDBTeamId);
  1679.     Query_Execute(0);
  1680.  
  1681.     // ****************************************************************
  1682.     // fin de la partie glauque...
  1683.     // ****************************************************************
  1684.  
  1685. // week synchronisation : insert and update
  1686.     iWeekNameJoin=Join_Constructor(iQueryServerSubset,"DYN_training_week.gene_sz_name");
  1687.  
  1688.     iNumRows=Table_GetNumRows(iQueryReceivedSubset,0);
  1689.     i=0;
  1690.     while (i<iNumRows)
  1691.     {
  1692.         szReceivedWeekName=Database_GetStringData(iQueryReceivedSubset,"DYN_training_week.gene_sz_name",ROW_INDEX,i);
  1693.         iServerIDWeek=Join_FindKeyFromStringData(iWeekNameJoin,szReceivedWeekName);
  1694.         iReceivedIDWeek=Database_GetIntData(iQueryReceivedSubset,"DYN_training_week.IDtraining_week",ROW_INDEX,i);
  1695.  
  1696.         if (iServerIDWeek!=-1)
  1697.         {
  1698.             UpdateTrainingWeek(_iDatabase,iReceivedIDWeek,DATABASE_SERVER,iServerIDWeek);
  1699.         }
  1700.         else
  1701.         {
  1702.             CreateTrainingWeek(_iDatabase,iReceivedIDWeek,DATABASE_SERVER);
  1703.         }
  1704.         
  1705.         i=i+1;
  1706.     }
  1707.  
  1708.     Join_Destructor(iWeekNameJoin);
  1709. // week synchronized : insert and update
  1710.  
  1711.     Subset_Destructor(iQueryServerSubset);
  1712.     Subset_Destructor(iQueryReceivedSubset);
  1713.  
  1714.     Database_SendSynchronization(DATABASE_SERVER);
  1715.  
  1716. //    Database_HTMLDebugPrint(DATABASE_SERVER);
  1717. }
  1718.  
  1719.  
  1720. /*
  1721. // ========== training season function ===================
  1722.  
  1723. func i32x FindTrainingSeason(i32x _iQuerySubset,i32x _iIDCyclist)
  1724. {
  1725.     var i32x iIDTrainingSeason;
  1726.  
  1727.     iIDTrainingSeason=0;
  1728.  
  1729.     DatabaseSubset_Clear(_iQuerySubset);
  1730.  
  1731.     Query_Create(0,_iQuerySubset);
  1732.     Query_SelectTable(0,"DYN_training_season");
  1733.     Query_SelectWhereIntEqual(0,"DYN_training_season.fkIDcyclist",_iIDCyclist);
  1734.     Query_Execute(0);
  1735.  
  1736.     if (Table_GetNumRows(_iQuerySubset,0)==1)
  1737.     {
  1738.         iIDTrainingSeason=Database_GetIntData(_iQuerySubset,"DYN_training_season.IDtraining_season",ROW_INDEX,0);
  1739.     }
  1740.     else
  1741.     {
  1742.         print("WARNING DE LA MORT QUI TUE!!!!!!!!!  ("+itoa(Table_GetNumRows(_iQuerySubset,0))+")\n");
  1743.     }
  1744.  
  1745.     return(iIDTrainingSeason);
  1746. }
  1747.  
  1748. func i32x FindWeekNumber()
  1749. {
  1750.     var i32x iJoinId;
  1751.     var i32x iNumWeeks;
  1752.  
  1753.     iJoinId=Join_Constructor(DATABASE_SERVER,"DYN_day.gene_i_year_week");
  1754.     Join_Sort(iJoinId,1);
  1755.     iNumWeeks=Join_GetIntFromSortedIndex(iJoinId,Join_GetNumRows(iJoinId)-1);
  1756.     Join_Destructor(iJoinId);
  1757.  
  1758.     return(iNumWeeks);
  1759. }
  1760.  
  1761. func void RemoveAllTrainingWeeks(i32x _iDataBase,i32x _iIDServerSeason)
  1762. {
  1763.     var i32x i,iNumWeeks;
  1764.     var i32x iQuerySubset;
  1765.  
  1766.     iQuerySubset=Subset_Constructor("TRAINING_WEEKS_REMOVE_QUERY",_iDataBase);
  1767.     Database_AddTables(iQuerySubset,1);
  1768.     Table_SetName(iQuerySubset,0,"DYN_training_season_week");
  1769.     TableSubset_SelectColumns(iQuerySubset,0,"*");
  1770.  
  1771.     iNumWeeks=FindWeekNumber();
  1772.     i=1;
  1773.     while (i<=iNumWeeks)
  1774.     {
  1775.         DatabaseSubset_Clear(iQuerySubset);
  1776.  
  1777.         Query_Create(0,iQuerySubset);
  1778.         Query_SelectTable(0,"DYN_training_season_week");
  1779.         Query_SelectWhereIntEqual(0,"DYN_training_season_week.gene_i_week",i);
  1780.         Query_SelectWhereIntEqual(0,"DYN_training_season_week.fkIDtraining_season",_iIDServerSeason);
  1781.         Query_Execute(0);
  1782.  
  1783.         if (Table_GetNumRows(iQuerySubset,0)==1)
  1784.         {
  1785.             Table_DeleteRowFromIndex(iQuerySubset,0,0);
  1786.         }
  1787.  
  1788.  
  1789.         i=i+1;
  1790.     }
  1791.  
  1792.     Subset_Destructor(iQuerySubset);
  1793.  
  1794. }
  1795.  
  1796. func void CopyAllTrainingWeeks(i32x _iSourceSubset,i32x _iIDReceivedSeason,i32x _iDestinationSubset,i32x _iIDServerSeason)
  1797. {
  1798.     var i32x i,iNumWeeks;
  1799.     var i32x iQuerySubset;
  1800.     var i32x iTrainingWeekRow;
  1801.     var i32x iTrainingSeasonWeekIndex;
  1802.     var i32x iIDTrainingWeek;
  1803.  
  1804.     iQuerySubset=Subset_Constructor("TRAINING_WEEKS_REMOVE_QUERY",_iSourceSubset);
  1805.     Database_AddTables(iQuerySubset,1);
  1806.     Table_SetName(iQuerySubset,0,"DYN_training_season_week");
  1807.     TableSubset_SelectColumns(iQuerySubset,0,"*");
  1808.  
  1809.     iTrainingSeasonWeekIndex=Table_GetIndexFromName(_iDestinationSubset,"DYN_training_season_week");
  1810.  
  1811.     iNumWeeks=FindWeekNumber();
  1812.     i=1;
  1813.     while (i<=iNumWeeks)
  1814.     {
  1815.         DatabaseSubset_Clear(iQuerySubset);
  1816.  
  1817.         Query_Create(0,iQuerySubset);
  1818.         Query_SelectTable(0,"DYN_training_season_week");
  1819.         Query_SelectWhereIntEqual(0,"DYN_training_season_week.gene_i_week",i);
  1820.         Query_SelectWhereIntEqual(0,"DYN_training_season_week.fkIDtraining_season",_iIDReceivedSeason);
  1821.         Query_Execute(0);
  1822.  
  1823.         if (Table_GetNumRows(iQuerySubset,0)==1)
  1824.         {
  1825.             iTrainingWeekRow=Table_AddRow(_iDestinationSubset,iTrainingSeasonWeekIndex);
  1826.  
  1827.             iIDTrainingWeek=Database_GetIntData(iQuerySubset,"DYN_training_season_week.fkIDtraining_week",ROW_INDEX,0);
  1828.  
  1829.             Database_SetIntData(_iDestinationSubset,"DYN_training_season_week.gene_i_week",ROW_INDEX,iTrainingWeekRow,i);
  1830.             Database_SetIntData(_iDestinationSubset,"DYN_training_season_week.fkIDtraining_week",ROW_INDEX,iTrainingWeekRow,iIDTrainingWeek);
  1831.             Database_SetIntData(_iDestinationSubset,"DYN_training_season_week.fkIDtraining_season",ROW_INDEX,iTrainingWeekRow,_iIDServerSeason);
  1832.         
  1833.         }
  1834.  
  1835.         i=i+1;
  1836.     }
  1837.  
  1838.     Subset_Destructor(iQuerySubset);
  1839. }
  1840.  
  1841. func i32x CreateTrainingSeason(i32x _iDatabase,i32x _iIDCyclist)
  1842. {
  1843.     var i32x iIDTrainingSeason;
  1844.     var i32x iTrainingSeasonRow;
  1845.     var i32x iTableIndex;
  1846.  
  1847.     iTableIndex=Table_GetIndexFromName(_iDatabase,"DYN_training_season");
  1848.  
  1849.     iTrainingSeasonRow=Table_AddRow(_iDatabase,iTableIndex);
  1850.     iIDTrainingSeason=Database_GetIntData(_iDatabase,"DYN_training_season.IDtraining_season",ROW_INDEX,iTrainingSeasonRow);
  1851.  
  1852.     Database_SetIntData(_iDatabase,"DYN_training_season.fkIDcyclist",ROW_INDEX,iTrainingSeasonRow,_iIDCyclist);
  1853.  
  1854.     return(iIDTrainingSeason);
  1855. }
  1856. // ========== the end ===================
  1857.  
  1858.  
  1859. func void fnReadDB_TrainingSeason(i32x _iUserId,i32x _iDatabase)
  1860. {
  1861.     var i32x i,iNumCyclists;
  1862.     var i32x iIDCyclist;
  1863.     var i32x iIDServerSeason;
  1864.     var i32x iIDReceivedSeason;
  1865.  
  1866.     var i32x iIDTeam;
  1867.  
  1868.     var i32x iServerQuerySubset;
  1869.     var i32x iReceivedQuerySubset;
  1870.     var i32x iCyclistSubset;
  1871.  
  1872.     print("here we go!!!!!!!!!!\n");
  1873.  
  1874.     iIDTeam=Join_GetIntFromKey(g_stJoins.m_iUser_iTeamId,_iUserId);
  1875.  
  1876.     iCyclistSubset=Subset_Constructor("TEAM_CYCLISTS_SUBSET",DATABASE_SERVER);
  1877.     Database_AddTables(iCyclistSubset,1);
  1878.     Table_SetName(iCyclistSubset,0,"DYN_cyclist");
  1879.     TableSubset_SelectColumns(iCyclistSubset,0,"*");
  1880.     Query_Create(0,iCyclistSubset);
  1881.     Query_SelectTable(0,"DYN_cyclist");
  1882.     Query_SelectWhereIntEqual(0,"DYN_cyclist.fkIDteam",iIDTeam);
  1883.     Query_Execute(0);
  1884.  
  1885.     iServerQuerySubset=Subset_Constructor("TRAINING_SEASON_SERVER_QUERY_SUBSET",DATABASE_SERVER);
  1886.     Database_AddTables(iServerQuerySubset,1);
  1887.     Table_SetName(iServerQuerySubset,0,"DYN_training_season");
  1888.     TableSubset_SelectColumns(iServerQuerySubset,0,"*");
  1889.  
  1890.     iReceivedQuerySubset=Subset_Constructor("TRAINING_SEASON_RECEIVED_QUERY_SUBSET",_iDatabase);
  1891.     Database_AddTables(iReceivedQuerySubset,1);
  1892.     Table_SetName(iReceivedQuerySubset,0,"DYN_training_season");
  1893.     TableSubset_SelectColumns(iReceivedQuerySubset,0,"*");
  1894.  
  1895.     iNumCyclists=Table_GetNumRows(iCyclistSubset,0);
  1896.     i=0;
  1897.     while (i<iNumCyclists)
  1898.     {
  1899.         print("\t"+itoa(i+1)+"/"+itoa(iNumCyclists)+"\n");
  1900.  
  1901.         iIDCyclist=Database_GetIntData(iCyclistSubset,"DYN_cyclist.IDcyclist",ROW_INDEX,i);
  1902.         print("\ttraining season of "+itoa(iIDCyclist)+"\n");
  1903.  
  1904.         iIDServerSeason=FindTrainingSeason(iServerQuerySubset,iIDCyclist);
  1905.         if (iIDServerSeason==0)
  1906.             iIDServerSeason=CreateTrainingSeason(DATABASE_SERVER,iIDCyclist);
  1907.         print("\t   server   ="+itoa(iIDServerSeason)+"\n");
  1908.         iIDReceivedSeason=FindTrainingSeason(iReceivedQuerySubset,iIDCyclist);
  1909.         print("\t   received ="+itoa(iIDReceivedSeason)+"\n");
  1910.  
  1911.         RemoveAllTrainingWeeks(DATABASE_SERVER,iIDServerSeason);
  1912.         Database_DeleteNow(DATABASE_SERVER);
  1913.  
  1914.         CopyAllTrainingWeeks(_iDatabase,iIDReceivedSeason,DATABASE_SERVER,iIDServerSeason);
  1915.  
  1916.         i=i+1;
  1917.     }
  1918.  
  1919.     Subset_Destructor(iServerQuerySubset);
  1920.     Subset_Destructor(iReceivedQuerySubset);
  1921.  
  1922.     //Database_HTMLDebugPrint(DATABASE_SERVER);
  1923. }
  1924. */
  1925.  
  1926.  
  1927. /*
  1928.  * fnReadDB_TrainingSeason : 
  1929.  * updates the training season of the user team on the server.
  1930.  * (each cyclist MUST already have a complete training season
  1931.  * during the year -> no holes in the table)
  1932.  */
  1933. func void fnReadDB_TrainingSeason(i32x _iUserId,i32x _iDatabase)
  1934. {
  1935.     var i32x iNumCyclists,i;
  1936.     var i32x iServerQuerySubset,iClientQuerySubset;
  1937.     var i32x iServerCyclistIDJoin,iClientCyclistIDJoin;
  1938.     var i32x iServerWeekIndexJoin,iClientWeekIndexJoin;
  1939.     var i32x iServerWeekIDJoin,iClientWeekIDJoin;
  1940.     var i32x iIDCyclist;
  1941.     var i32x iWeekIndex;
  1942.     var i32x iIDTeam;
  1943.     var i32x iWeekID;
  1944.  
  1945.     iIDTeam=Join_GetIntFromKey(g_stJoins.m_iUser_iTeamId,_iUserId);
  1946.  
  1947.     iServerQuerySubset=Subset_Constructor("TRAINING_SEASON_SERVER_QUERY_SUBSET",DATABASE_SERVER);
  1948.     Database_AddTables(iServerQuerySubset,3);
  1949.     Table_SetName(iServerQuerySubset,0,"DYN_training_season_week");
  1950.     TableSubset_SelectColumns(iServerQuerySubset,0,"*");
  1951.     Table_SetName(iServerQuerySubset,1,"DYN_training_season");
  1952.     TableSubset_SelectColumns(iServerQuerySubset,1,"*");
  1953.     Table_SetName(iServerQuerySubset,2,"DYN_cyclist");
  1954.     TableSubset_SelectColumns(iServerQuerySubset,2,"*");
  1955.  
  1956.     Query_Create(0,iServerQuerySubset);
  1957.     Query_SelectTable(0,"DYN_cyclist");
  1958.     Query_SelectWhereIntEqual(0,"DYN_cyclist.fkIDteam",iIDTeam);
  1959.     Query_Execute(0);
  1960.     Query_Create(1,iServerQuerySubset);
  1961.     Query_SelectTable(1,"DYN_training_season");
  1962.     Query_SelectWhereIntEqual(1,"DYN_training_season.fkIDcyclist.DYN_cyclist.fkIDteam",iIDTeam);
  1963.     Query_Execute(1);
  1964.     Query_Create(2,iServerQuerySubset);
  1965.     Query_SelectTable(2,"DYN_training_season_week");
  1966.     Query_SelectWhereIntEqual(2,"DYN_training_season_week.fkIDtraining_season.DYN_training_season.fkIDcyclist.DYN_cyclist.fkIDteam",iIDTeam);
  1967.     Query_Execute(2);
  1968.  
  1969.     Database_Update(iServerQuerySubset);
  1970.  
  1971.     iClientQuerySubset=Subset_Constructor("TRAINING_SEASON_RECEIVED_QUERY_SUBSET",_iDatabase);
  1972.     Database_AddTables(iClientQuerySubset,2);
  1973.     Table_SetName(iClientQuerySubset,0,"DYN_training_season_week");
  1974.     TableSubset_SelectColumns(iClientQuerySubset,0,"*");
  1975.     Table_SetName(iClientQuerySubset,1,"DYN_training_season");
  1976.     TableSubset_SelectColumns(iClientQuerySubset,1,"*");
  1977.  
  1978.     TableSubset_SelectAllRows(iClientQuerySubset,0);
  1979.     TableSubset_SelectAllRows(iClientQuerySubset,1);
  1980.  
  1981.     Database_Update(iClientQuerySubset);
  1982.  
  1983.     iServerWeekIndexJoin=Join_Constructor(iServerQuerySubset,"DYN_training_season_week.gene_i_week");
  1984.     Join_Sort(iServerWeekIndexJoin,1);
  1985.     iServerCyclistIDJoin=Join_Constructor(iServerQuerySubset,"DYN_training_season_week.fkIDtraining_season.DYN_training_season.fkIDcyclist");
  1986.     Join_Sort(iServerCyclistIDJoin,1);
  1987.     iServerWeekIDJoin=Join_Constructor(iServerQuerySubset,"DYN_training_season_week.fkIDtraining_week");
  1988.  
  1989.     iClientWeekIndexJoin=Join_Constructor(iClientQuerySubset,"DYN_training_season_week.gene_i_week");
  1990.     Join_Sort(iClientWeekIndexJoin,1);
  1991.     iClientCyclistIDJoin=Join_Constructor(iClientQuerySubset,"DYN_training_season_week.fkIDtraining_season.DYN_training_season.fkIDcyclist");
  1992.     Join_Sort(iClientCyclistIDJoin,1);
  1993.     iClientWeekIDJoin=Join_Constructor(iClientQuerySubset,"DYN_training_season_week.fkIDtraining_week");
  1994.  
  1995.     iNumCyclists=Table_GetNumRows(iServerQuerySubset,0);
  1996.     i=0;
  1997.     //print("num cyclists = "+itoa(iNumCyclists)+"\n");
  1998.     while (i<iNumCyclists)
  1999.     {
  2000.         iIDCyclist=Join_GetIntFromIndex(iServerCyclistIDJoin,i);
  2001.         if (iIDCyclist!=Join_GetIntFromIndex(iClientCyclistIDJoin,i))
  2002.             print("fuck 1 !!\n");
  2003.         //print("\tserver:\n\t\tcyclist = "+itoa(Join_GetIntFromIndex(iServerCyclistIDJoin,i))+"\n");
  2004.         //print("\t\tweek = "+itoa(Join_GetIntFromIndex(iServerWeekIndexJoin,i))+"\n");
  2005.  
  2006.         iWeekIndex=Join_GetIntFromIndex(iServerWeekIndexJoin,i);
  2007.         if (iWeekIndex!=Join_GetIntFromIndex(iClientWeekIndexJoin,i))
  2008.             print("fuck 2 !!\n");
  2009.         //print("\tclient:\n\t\tcyclist = "+itoa(Join_GetIntFromIndex(iClientCyclistIDJoin,i))+"\n");
  2010.         //print("\t\tweek = "+itoa(Join_GetIntFromIndex(iClientWeekIndexJoin,i))+"\n");
  2011.  
  2012.         iWeekID=Join_GetIntFromIndex(iClientWeekIDJoin,i);
  2013.         Join_SetIntFromIndex(iServerWeekIDJoin,i,iWeekID);
  2014.  
  2015.         //print("\t------\n");
  2016.         i=i+1;
  2017.     }
  2018.  
  2019.     Subset_Destructor(iServerQuerySubset);
  2020.     Subset_Destructor(iClientQuerySubset);
  2021.  
  2022.     Database_SendSynchronization(DATABASE_SERVER);
  2023. }
  2024.  
  2025.